// 给定一个二叉树，判断其是否是一个有效的二叉搜索树。

// 假设一个二叉搜索树具有如下特征：

// 节点的左子树只包含小于当前节点的数。
// 节点的右子树只包含大于当前节点的数。
// 所有左子树和右子树自身必须也是二叉搜索树。
// 示例 1:
// 输入:
//     2
//    / \
//   1   3
// 输出: true


// 示例 2:
// 输入:
//     5
//    / \
//   1   4
//      / \
//     3   6
// 输出: false
// 解释: 输入为: [5,1,4,null,null,3,6]。
//      根节点的值为 5 ，但是其右子节点值为 4 。


/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function (root) {
  /* 递归函数validBST参数：
      node，当前处理的节点。
      min：当前节点不能低于的最小值，
      max：当前节点不能大于的最大值
   */
  let validBST = (node, min, max) => {
    // 空节点直接返回true
    if (!node) return true;
    // 不符合  min <= node.val <= max 直接为false
    if (node.val <= min || node.val >= max) return false;
    // 递归node的左子树和右子树，保证两个子树都是BST
    // 左子树最大值不能大于node.val,右子树最小值不能小于node.val
    return validBST(node.left, min, node.val) && validBST(node.right, node.val, max);
  }
  return validBST(root, -Number.MAX_VALUE, Number.MAX_VALUE)
};
